//#include "log.hpp"
//
//#include <cstdarg>
//#include <cstddef>
//#include <cstring>
//#include <iterator>
//
//#include "time.hpp"
//
//static const char *const level_texts[(int)log_level::cnt] {
//    "[T]", "[D]", "[I]", "[W]", "[E]", "[C]",
//};
//
//static_assert(std::size(level_texts) == (size_t)log_level::cnt);
//
//static void platform_console_write(const char *text, u8 lv, bool error);
//
//void core::log::log_output(log_level lv, const char *filename, i32 line,
//                           const char *msg, ...)
//{
//    static thread_local char text_buffer[8192];
//    memset(text_buffer, 0x00, sizeof(text_buffer));
//
//    f32 time = util::get_time();
//    char buffer[1024] {0};
//    snprintf(buffer, sizeof(buffer), "[%8.2f] %s %s:%d:%s\n", (double)time, level_texts[(u8)lv],
//             filename, line, msg);
//
//    va_list args;
//    va_start(args, msg);
//    vsnprintf(text_buffer, sizeof(text_buffer), buffer, args);
//    va_end(args);
//
//    platform_console_write(text_buffer, (u8)lv, lv >= log_level::warning);
//}
//
//#if _WIN32
//    #include <Windows.h>
//    #include <string>
//
//inline std::wstring fromUtf8(const std::string &input)
//{
//    const int len =
//        MultiByteToWideChar(CP_ACP, 0, input.c_str(), -1, nullptr, 0);
//    std::wstring out_wide_string;
//    out_wide_string.resize(len + 1);
//    out_wide_string[len] = 0;
//    MultiByteToWideChar(CP_ACP, 0, input.c_str(), -1, &out_wide_string[0], len);
//    out_wide_string.resize(len - 1);
//    return out_wide_string;
//}
//
//// inline std::string toUtf8(const std::wstring& input) {
////     int length = WideCharToMultiByte(CP_UTF8, 0, input.data(), -1, nullptr,
////     0, nullptr, nullptr); std::string out_string; out_string.resize(length +
////     1); length = WideCharToMultiByte(CP_UTF8, 0, input.data(), -1,
////     &out_string[0], length, nullptr, nullptr); out_string[length] = 0;
////     out_string.resize(length - 1);
////     return out_string;
//// }
//
//struct ConsoleInitHelper {
//    ConsoleInitHelper()
//    {
//        HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//        HANDLE hErr = GetStdHandle(STD_ERROR_HANDLE);
//
//        DWORD flags = ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_PROCESSED_OUTPUT |
//                      ENABLE_VIRTUAL_TERMINAL_PROCESSING;
//
//        BOOL r1      = SetConsoleMode(hOut, flags);
//        BOOL r2      = SetConsoleMode(hErr, flags);
//        is_supported = r1 && r2;
//    }
//    ~ConsoleInitHelper() {}
//
//    [[nodiscard]] bool vtCompatible() const { return is_supported; }
//
//private:
//    bool is_supported {false};
//};
//
//void platform_console_write(const char *text, u8 lv, bool error)
//{
//    static ConsoleInitHelper _;
//
//    static u8 levels[] = {64, 4, 6, 2, 1, 8};
//
//    std::wstring wide_text = fromUtf8(text);
//
//    if (_.vtCompatible()) {
//        static const wchar_t *colour_strings[] = {L"0;97", L"0;96", L"1;92",
//                                                  L"0;93", L"1;91", L"7;91"};
//        if (error) {
//            fwprintf(stderr, L"\033[%sm%s\033[0m", colour_strings[lv],
//                     wide_text.c_str());
//        } else {
//            fwprintf(stdout, L"\033[%sm%s\033[0m", colour_strings[lv],
//                     wide_text.c_str());
//        }
//    } else {
//        if (error) {
//            fwprintf(stderr, L"%s", wide_text.c_str());
//        } else {
//            fwprintf(stdout, L"%s", wide_text.c_str());
//        }
//    }
//
//    OutputDebugStringW(wide_text.c_str());
//
//    // std::wstring wide_text = fromUtf8(text);
//    // HANDLE outTarget = INVALID_HANDLE_VALUE;
//    // if (error)
//    // {
//    //     outTarget = GetStdHandle(STD_ERROR_HANDLE);
//    // }
//    // else
//    // {
//    //     outTarget = GetStdHandle(STD_OUTPUT_HANDLE);
//    // }
//    //
//    // OutputDebugStringW(wide_text.c_str());
//    // DWORD length = (DWORD)wide_text.length();
//    // SetConsoleTextAttribute(outTarget, levels[lv]);
//    // WriteConsoleW(outTarget, wide_text.c_str(), length, nullptr, nullptr);
//    // SetConsoleTextAttribute(outTarget, 0);
//}
//#elif __unix__
//
//void platform_console_write(const char *text, u8 lv, bool error)
//{
//    static const char *colour_strings[] = {"0;97", "0;96", "1;92",
//                                           "0;93", "1;91", "7;91"};
//    if (error) {
//        fprintf(stderr, "\033[%sm%s\033[0m", colour_strings[lv], text);
//    } else {
//        fprintf(stdout, "\033[%sm%s\033[0m", colour_strings[lv], text);
//    }
//}
//
//#else
//    #error "Code Not ported yet!"
//#endif
